﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using System.Collections;
using Ferreteria.Clases;

namespace Ferreteria
{
    public partial class frmCotizacion : Form
    {
        DisancoEntities context;
        int id_proveedor_orden;
        decimal monto;
        bool ultimapag;
        Proveedores ProvdelaOrden;
        int countArticulos;
        const int tagSeleccionado = 1;
        OrdenCompra Ordenaimprimir;
        Color bcProvSel = Color.LightGreen;
        Color sbcProvSel = Color.DarkGreen;
        Color bcProvNoSel = SystemColors.Window;
        Color sbcProvNoSel = SystemColors.Highlight;
        int cantartdelprov;

        public frmCotizacion()
        {
            InitializeComponent();
            cmbTipoBusqueda.SelectedIndex = 0;
           

            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            string prov_id;
            string provNombre;
            
            foreach (var prov in context.Proveedores)
            {
                prov_id = prov.prov_id.ToString();
                provNombre = prov.prov_nombre;

                dgvCotizacion.Columns.Add(prov_id, provNombre);
                dgvCotizacion.Columns[prov_id].Visible = false;
                dgvCotizacion.Columns[prov_id].MinimumWidth = 100;
                dgvCotizacion.Columns[prov_id].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                dgvCotizacion.Columns[prov_id].ReadOnly = true;
                dgvCotizacion.Columns[prov_id].DefaultCellStyle.Format = "$ 0.00";
            }

            dgvArticulos.AutoGenerateColumns = false;
            cargarTablaArticulos();
            }

        //Procesos
        private Font printFont = new Font("Calibri", 11);
        private Font FontTit = new Font("Calibri", 12);
        private Font miniprintFont = new Font("Calibri", 8);
        private Font printFontNormal10 = new Font("Calibri", 10);

        private void pdocOrden_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            int margenX = 25;
            int margenY = 50;
            int anchoHoja = 800;

            PointF punto = new PointF();
            punto.X = anchoHoja / 2;
            punto.Y = margenY + 30;

            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            //e.Graphics.DrawString("Documento No Valido Como Factura", FontTit, Brushes.Black, 310, 20);
            //e.Graphics.DrawString(" X ", FontTit, Brushes.Black, 400, 7);

            string comprobnumero = Ordenaimprimir.ord_numero.ToString("0000-00000000");
            e.Graphics.DrawString(comprobnumero, FontTit, Brushes.Black, 640, 40);
            e.Graphics.DrawString("Orden de Compra Nro.:", FontTit, Brushes.Black, 535, 40, formato);

            string fecha = DateTime.Now.Date.ToString("dd/MM/yyyy");
            e.Graphics.DrawString("Fecha:", FontTit, Brushes.Black, 600, 70, formato);
            e.Graphics.DrawString(fecha, FontTit, Brushes.Black, 640, 70);
            e.Graphics.DrawLine(Pens.Black, 10, 110, 800, 110);

            e.Graphics.DrawString(ProvdelaOrden.prov_nombre, FontTit, Brushes.Black, 110, 70);
            //e.Graphics.DrawString(ProvdelaOrden.prov_direccion, printFont, Brushes.Black, 130, 150);
            //e.Graphics.DrawString(ProvdelaOrden.prov_localidad, printFont, Brushes.Black, 550, 150);
            //e.Graphics.DrawString(ProvdelaOrden.prov_tel1, printFont, Brushes.Black, 130, 170);
            //e.Graphics.DrawLine(Pens.Black, 10, 200, 800, 200);

            e.Graphics.DrawString("Proveedor:", FontTit, Brushes.Black, 70, 70, formato);
            //e.Graphics.DrawString("Dirección:", printFont, Brushes.Black, 80, 150, formato);
            //e.Graphics.DrawString("Localidad:", printFont, Brushes.Black, 500, 150, formato);
            //e.Graphics.DrawString("Telefono:", printFont, Brushes.Black, 80, 170, formato);


            int posYencab = 120;
            String Cant = "Cantidad";
            e.Graphics.DrawString(Cant, printFont, Brushes.Black, 22, posYencab);
            String Art = "Articulo";
            e.Graphics.DrawString(Art, printFont, Brushes.Black, 310, posYencab);
            String PrecioU = "Precio U";
            e.Graphics.DrawString(PrecioU, printFont, Brushes.Black, 577, posYencab);
            //String Bonif = "Bonif.";
            //e.Graphics.DrawString(Bonif, printFontNormal10, Brushes.Black, 630, posYencab);

            //String PrecioOf = "Precio Of";
            //e.Graphics.DrawString(PrecioOf, printFontNormal10, Brushes.Black, 680, posYencab);

            String Importe = "Total";
            e.Graphics.DrawString(Importe, printFont, Brushes.Black, 750, posYencab);

            int posY = posYencab + 20;
            int anchoLinea = 18;
            int posCantidad = margenX + 15;
            int posArticulo = posCantidad + 60;
            int posPrecioU = posArticulo + 470;
            int posBonif = posPrecioU + 57;
            int posPrecioOf = posBonif + 52;
            int posPrecioT = posPrecioOf + 62;

            int lineafin = 1045;
            int posSubtotX = 90;

            e.Graphics.DrawLine(Pens.Black, 10, 1035, 825, 1035);
        
            int countLineas = 0;
            int maxLineas = 35;
            countArticulos = 0;
            int maxArticulos = dgvCotizacion.Rows.Count;

            while (countLineas < maxLineas && countArticulos < maxArticulos)
            {

                if (countArticulos < cantartdelprov)
                {
                    DataGridViewRow fila = dgvOrdenCompra.Rows[countArticulos];

                    e.Graphics.DrawString(fila.Cells[2].Value.ToString(), printFont, Brushes.Black, posCantidad, posY);
                    decimal cantidadfila = Convert.ToDecimal(fila.Cells[2].Value);
                    e.Graphics.DrawString(fila.Cells[1].Value.ToString(), printFont, Brushes.Black, posArticulo, posY);
                    decimal PrecioUnitfila = Math.Round(Convert.ToDecimal(fila.Cells[3].Value), 2);
                    e.Graphics.DrawString("$ " + Convert.ToString(PrecioUnitfila), printFont, Brushes.Black, posPrecioU, posY);
                    decimal preciototalFila = Math.Round(Convert.ToDecimal(cantidadfila * PrecioUnitfila), 2);
                    e.Graphics.DrawString("$ " + preciototalFila.ToString(), printFont, Brushes.Black, posPrecioT, posY);
                
                }
                countArticulos++;
                countLineas++;
                posY += anchoLinea;
            }

            if (countArticulos == maxArticulos)
            {
                e.HasMorePages = false;
                ultimapag = true;
            }
            else
                e.HasMorePages = true;

            if (ultimapag)
            {
                String tot = "TOTAL  $";
                e.Graphics.DrawString(tot, printFont, Brushes.Black, posSubtotX + 565, lineafin);
                decimal total = Decimal.Round(Convert.ToDecimal(Ordenaimprimir.ord_monto), 2);
                e.Graphics.DrawString("$" + Convert.ToString(total), printFont, Brushes.Black, posSubtotX + 650, lineafin);
            }
        }
        
        private void cargarTablaArticulos()
        {
            try
            {
                context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

                //dgvArticulos.DataSource = context.VistaArticulos.Top("80");
                dgvArticulos.DataSource = context.Vista_SoloArticulosCompra.Top("100");
                dgvArticulos.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                dgvArticulos.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
           
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        //Funciones
        private int obtenerNumeroOrden()
        {
            try
            {
               int num = (from orden in context.OrdenCompra
                             select orden.ord_numero).Max();

                return num + 1;
            }
            catch
            {
                return 1;
            }
        }

        private void tsbGuardar_Click(object sender, EventArgs e)
        {
            cantartdelprov = 0;
            try
            {
                DialogResult dr = MessageBox.Show("¿Desea guardar esta orden de compra\npara el proveedor " + txbNombre.Text + "?", "Confirmacion", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (dr == System.Windows.Forms.DialogResult.Yes)
                {
                    OrdenCompra nueva_orden = new OrdenCompra();
                    nueva_orden.prov_id = id_proveedor_orden;
                    nueva_orden.ord_numero = obtenerNumeroOrden();
                    nueva_orden.ord_estado = true;
                    nueva_orden.ord_fecha = DateTime.Now;
                    nueva_orden.ord_monto = monto;

                    foreach (DataGridViewRow fila in dgvOrdenCompra.Rows)
                    {
                        LineaOrdenCompra linea_orden = new LineaOrdenCompra();
                        linea_orden.art_id = (int)fila.Cells["articulo_id"].Value;
                        linea_orden.linord_cant = (int)fila.Cells["articulo_cantidad"].Value;
                        linea_orden.linord_precio = (decimal)fila.Cells["articulo_precio"].Value;

                        nueva_orden.LineaOrdenCompra.Add(linea_orden);
                        cantartdelprov = cantartdelprov + 1;
                    }

                    context.OrdenCompra.AddObject(nueva_orden);
                    context.SaveChanges();
                    Ordenaimprimir = new OrdenCompra();
                    Ordenaimprimir = nueva_orden;
                    MessageBox.Show("La orden se guardo correctamente", "Operacion Exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    ProvdelaOrden = context.Proveedores.FirstOrDefault(p => p.prov_id == nueva_orden.prov_id);
                    DialogResult preg = MessageBox.Show("¿Desea Imprimir la Orden de Compra?", "Imprimir", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (preg == System.Windows.Forms.DialogResult.Yes)
                    {
                       
                        ImprirmirOrdenCompra();
                        countArticulos = 0;
                        tsbGuardar.Enabled = false;
                    }
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }
  
        private void ImprirmirOrdenCompra()
        {
            printDialog.PrinterSettings.Copies = 1;
            DialogResult resultunico = printDialog.ShowDialog();


            if (resultunico == DialogResult.OK)
            {
                pdocOrden.PrinterSettings = printDialog.PrinterSettings;
                printPreviewD.Document = pdocOrden;
                ((Form)printPreviewD).WindowState = FormWindowState.Maximized;
                printPreviewD.ShowDialog();
            }
        }

        private void agregarArticulo()
        {
            //int articulo_id = (int)dgvArticulos.CurrentRow.Cells["artc__id"].Value;
            int articulo_id = (int)dgvArticulos.CurrentRow.Cells["artc__id"].Value;
            Forms.OrdenCompra.frmAgregarArticulo agregarArt = new Forms.OrdenCompra.frmAgregarArticulo(articulo_id);
            DialogResult dr = agregarArt.ShowDialog();

            int prov_id_seleccionado = agregarArt.Proveedor;
            int cantidad = agregarArt.Cantidad;

            if (dr == DialogResult.OK)
            {
                bool existe = false;
                foreach (DataGridViewRow fila in dgvCotizacion.Rows)
                {
                    if (fila.Cells["art_id"].Value.ToString() == articulo_id.ToString())
                    {
                        existe = true;
                        break;
                    }
                }

                if (!existe)
                {
                    var objArticulo = context.ArticulosdeCompra.FirstOrDefault(a => a.artc_id == articulo_id);

                    if (objArticulo.CatalogoProv.Count > 0)
                        //objArticulo.ProveedoresxArticulos.Count > 0)
                    {
                        int indice = dgvCotizacion.Rows.Add();

                        dgvCotizacion.Rows[indice].Cells["art_id"].Value = objArticulo.artc_id;

                        dgvCotizacion.Rows[indice].Cells["art_nombre"].Value = objArticulo.artc_descripcion;
                        dgvCotizacion.Rows[indice].Cells["art_nombre"].Style.Alignment = DataGridViewContentAlignment.MiddleLeft;
                        dgvCotizacion.Rows[indice].Cells["art_nombre"].Style.BackColor = Color.White;

                        dgvCotizacion.Rows[indice].Cells["cantidad"].Value = cantidad;
                        dgvCotizacion.Rows[indice].Cells["cantidad"].Style.BackColor = Color.White;
                        dgvCotizacion.Rows[indice].Cells["cantidad"].ValueType = typeof(int);

                        string proveedor_id;
                        decimal precio;
                        decimal bonificacion;

                        foreach (var proveedor in objArticulo.CatalogoProv)
                        {
                            proveedor_id = proveedor.provid.ToString();
                            bonificacion = Convert.ToDecimal(proveedor.catalogobonifart);
                            precio = Funcion.PrecioBonificado(Convert.ToDecimal(proveedor.catalogoprecioart), bonificacion);
                            
                            //proveedor_id = proveedor.prov_id.ToString();
                            //bonificacion = Convert.ToDecimal(proveedor.prov_art_bonif);
                            //precio = Funcion.PrecioBonificado(proveedor.prov_art_precio, bonificacion);


                            dgvCotizacion.Rows[indice].Cells[proveedor_id].Value = precio;
                            dgvCotizacion.Rows[indice].Cells[proveedor_id].Style.BackColor = bcProvNoSel;

                            dgvCotizacion.Columns[proveedor_id].Visible = true;
                        }

                        string provIdMenorPrecio = prov_id_seleccionado.ToString();

                        dgvCotizacion.Rows[indice].Cells[provIdMenorPrecio].Style.BackColor = bcProvSel;
                        dgvCotizacion.Rows[indice].Cells[provIdMenorPrecio].Style.SelectionBackColor = sbcProvSel;
                        dgvCotizacion.Rows[indice].Cells[provIdMenorPrecio].Tag = tagSeleccionado;
                    }
                    else
                    {
                        MessageBox.Show("No se encontraron proveedores para este articulo", "Error:", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show("Este articulo ya se encuentra en la lista", "Error:", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
       
        void buscar()
        {
            if (txbBuscar.Text == "")
            {
                cargarTablaArticulos();
            }
            else
            {
                if (txbBuscar.Text.Length > 2)
                {
                    try
                    {
                        context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
                        IEnumerable<VistaArticulos> query;

                        string cadena = txbBuscar.Text;
                        string tipo_busqueda = (string)cmbTipoBusqueda.SelectedItem;

                        switch (tipo_busqueda)
                        {
                            case "Nombre del proveedor":
                                {
                                    query = from vista in context.VistaArticulos
                                            join prov_art in context.ProveedoresxArticulos on vista.art_id equals prov_art.art_id
                                            where prov_art.Proveedores.prov_nombre.Contains(cadena)
                                            select vista;
                                    break;
                                }
                            case "Categoria":
                                {
                                    query = from vista in context.VistaArticulos
                                            where vista.categ_nombre.Contains(cadena)
                                            select vista;
                                    break;
                                }
                            case "Rubro":
                                {
                                    query = from vista in context.VistaArticulos
                                            join art in context.Articulos on vista.art_id equals art.art_id
                                            where art.Categorias.Rubros.rubro_nombre.Contains(cadena)
                                            select vista;
                                    break;
                                }
                            default:
                                {
                                    query = from vista in context.VistaArticulos
                                            where vista.art_nombre.Contains(txbBuscar.Text)
                                            select vista;
                                    break;
                                }

                        } 
                        dgvArticulos.DataSource = query;
                       
                       }
                    
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }

        //Eventos

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscar();
            //string cadena = txbBuscar.Text;
            //string tipo_busqueda = (string)cmbTipoBusqueda.SelectedItem;

            //context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            //IEnumerable<VistaArticulos> query;

            //switch (tipo_busqueda)
            //{
            //    case "Nombre del proveedor":
            //        {
            //            query = from vista in context.VistaArticulos
            //                    join prov_art in context.ProveedoresxArticulos on vista.art_id equals prov_art.art_id
            //                    where prov_art.Proveedores.prov_nombre.Contains(cadena)
            //                    select vista;
            //            break;
            //        }
            //    case "Categoria":
            //        {
            //            query = from vista in context.VistaArticulos
            //                    where vista.categ_nombre.Contains(cadena)
            //                    select vista;
            //            break;
            //        }
            //    case "Rubro":
            //        {
            //            query = from vista in context.VistaArticulos
            //                    join art in context.Articulos on vista.art_id equals art.art_id
            //                    where art.Categorias.Rubros.rubro_nombre.Contains(cadena)
            //                    select vista;
            //            break;
            //        }
            //    default:
            //        {
            //            query = from vista in context.VistaArticulos
            //                    where vista.art_nombre.Contains(txbBuscar.Text)
            //                    select vista;
            //            break;
            //        }
            //}

            //dgvArticulos.DataSource = query;
        }

        private void txbBuscar_TextChanged(object sender, EventArgs e)
        {
            buscar();
        }
    
        private void tsbImprimir_Click(object sender, EventArgs e)
        {
            ImprirmirOrdenCompra();
        }

        private void tsCmbListaProveedores_SelectedIndexChanged(object sender, EventArgs e)
        {
           
            try
            {
                tsbGuardar.Enabled = true;
                string prov_nombre = (string)tsCmbListaProveedores.SelectedItem;

                this.id_proveedor_orden = (from p in context.Proveedores
                                           where p.prov_nombre == prov_nombre
                                           select p).First().prov_id;

                string prov_id = this.id_proveedor_orden.ToString();

                Proveedores objProveedor = context.Proveedores.FirstOrDefault(p => p.prov_id == this.id_proveedor_orden);

                txbNombre.Text = objProveedor.prov_nombre;
                txbDirección.Text = objProveedor.prov_direccion;
                txbUbicacion.Text = objProveedor.prov_ubicacion;
                txbTel1.Text = objProveedor.prov_tel1;
                txbTel2.Text = objProveedor.prov_tel2;
                txbFax.Text = objProveedor.prov_telefax;

                dgvOrdenCompra.Rows.Clear();

                monto = 0;
               
                foreach (DataGridViewRow filaArt in dgvCotizacion.Rows)
                {
                    if (filaArt.Cells[prov_id].Tag != null)
                    {
                        if ((int)filaArt.Cells[prov_id].Tag == 1)
                        {
                            int articulo_id = (int)filaArt.Cells["art_id"].Value;
                            string articulo_nombre = (string)filaArt.Cells["art_nombre"].Value;
                            int cantidad = (int)filaArt.Cells["cantidad"].Value;
                            decimal precio = (decimal)filaArt.Cells[prov_id].Value;

                            monto += precio * cantidad;

                            int idx_fila = dgvOrdenCompra.Rows.Add();
                            dgvOrdenCompra.Rows[idx_fila].Cells["articulo_id"].Value = articulo_id;
                            dgvOrdenCompra.Rows[idx_fila].Cells["articulo_nombre"].Value = articulo_nombre;
                            dgvOrdenCompra.Rows[idx_fila].Cells["articulo_cantidad"].Value = cantidad;
                            dgvOrdenCompra.Rows[idx_fila].Cells["articulo_precio"].Value = precio;
                            
                        }
                    }
                }

                txbMonto.Text = monto.ToString("0.00");
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message);
            }
        }

        private void dgvCotizacion_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("Solo se pueden ingresar aquí numeros enteros", "Error:", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        private void tsbActualizar_Click(object sender, EventArgs e)
        {
            cmbTipoBusqueda.SelectedIndex = 0;
            txbBuscar.Text = "";
            cargarTablaArticulos();
        }

        private void tsbAgregarArticulo_Click(object sender, EventArgs e)
        {
            agregarArticulo();
        }

        private void dgvArticulos_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            agregarArticulo();
        }

        private void tsbEliminarArticulo_Click(object sender, EventArgs e)
        {
            if (dgvCotizacion.CurrentRow != null)
            {
                dgvCotizacion.Rows.Remove(dgvCotizacion.CurrentRow);
            }
            else
            {
                MessageBox.Show("La lista ya esta vacía", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void dgvCotizacion_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex > 2) //Solo actuara sobre las columnas de proveedores
            {
                if (dgvCotizacion.CurrentCell.Value != null)
                {
                    foreach (DataGridViewCell celda in dgvCotizacion.CurrentRow.Cells)
                    {
                        if (celda.Value != null)
                            celda.Style.BackColor = bcProvNoSel;
                        else
                            celda.Style.BackColor = Color.Silver;

                        celda.Style.SelectionBackColor = sbcProvNoSel;
                        celda.Tag = null;
                    }

                    dgvCotizacion.CurrentCell.Style.BackColor = bcProvSel;
                    dgvCotizacion.CurrentCell.Style.SelectionBackColor = sbcProvSel;
                    dgvCotizacion.CurrentCell.Tag = tagSeleccionado;
                }
            }
        }

        private void tsbGenerarOrdenes_Click(object sender, EventArgs e)
        {
            if (dgvCotizacion.Rows.Count > 0)
            {
                dgvOrdenCompra.Rows.Clear();
                tsCmbListaProveedores.Items.Clear();

                //Se empieza en el indice 3 pues es la que corresponde a la columna del primer proveedor
                for (int i = 3; i < dgvCotizacion.Columns.Count; i++)
                {
                    if (dgvCotizacion.Columns[i].Visible)
                    {
                        //Recorro las filas de la columna del proveedor, para detectar si tiene algun articulo asignado.
                        foreach (DataGridViewRow filaArt in dgvCotizacion.Rows)
                        {
                            string proveedor_id = dgvCotizacion.Columns[i].Name;

                            if (Convert.ToInt32(filaArt.Cells[proveedor_id].Tag) == tagSeleccionado)
                            {
                                string proveedor_nombre = dgvCotizacion.Columns[i].HeaderText;
                                tsCmbListaProveedores.Items.Add(proveedor_nombre);
                                break;
                            }
                        }
                    }
                }
                tsCmbListaProveedores.SelectedIndex = 0;
            }
            else
            {
                MessageBox.Show("La lista de articulos cotizados debe poseer al menos un articulo", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void dgvArticulos_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                e.Handled = true;
                tsbAgregarArticulo_Click(sender, e);
               
            }
        }



    }
}
